#include "message.h"

using std::cout;
using std::endl;

int main()
{
    // rpc::RpcRequest::ptr rrp = rpc::MessageFactory::create<rpc::RpcRequest>();
    // Json::Value param;
    // param["num1"] = 11;
    // param["num2"] = 22;
    // rrp->Setmethod("Add");
    // rrp->Setparams(param);
    // std::string ret = rrp->serialize();
    // cout << ret << endl;
    // // rpc::BaseMessage::ptr bmp = rpc::MessageFactory::create(lxprpc::MType::REQ_RPC);

    // // bool r = bmp->unserialize(ret);
    // // if (r == false)
    // // {
    // //     return -1;
    // // }
    // // r = bmp->check();
    // // rpc::RpcRequest::ptr rrp2 = std::dynamic_pointer_cast<rpc::RpcRequest>(bmp);
    // rpc::RpcRequest::ptr rrp2 = rpc::MessageFactory::create<rpc::RpcRequest>();
    // rrp2->unserialize(ret);
    // cout << rrp2->method() << endl;
    // cout << rrp2->params()["num1"].asInt() << endl;
    // cout << rrp2->params()["num2"].asInt() << endl;

    // rpc::TopicRequest::ptr trp = rpc::MessageFactory::create<rpc::TopicRequest>();
    // trp->Settopic("news");
    // trp->Setoptype(lxprpc::TopicOptype::TOPIC_PUBLISH);
    // trp->Setmsg("hellow world");
    // std::string str = trp->serialize();
    // cout << str << endl;

    // rpc::TopicRequest::ptr trp1 = rpc::MessageFactory::create<rpc::TopicRequest>();
    // bool r = trp1->unserialize(str);
    // if (r == false)
    // {
    //     return -1;
    // }
    // r = trp1->check();
    // if (r == false)
    // {
    //     return -1;
    // }
    // cout << trp1->topic() << endl;
    // cout << (int)trp1->optype() << endl;
    // cout << trp1->msg() << endl;

    // rpc::ServiceRequest::ptr trp = rpc::MessageFactory::create<rpc::ServiceRequest>();
    // trp->Setmethod("add");
    // trp->Setoptype(lxprpc::ServiceOptype::SERVICE_DISCOVERY);
    // trp->Sethost(rpc::Address("127.0.0.1", 9090));
    // std::string str = trp->serialize();
    // cout << str << endl;

    // rpc::ServiceRequest::ptr trp1 = rpc::MessageFactory::create<rpc::ServiceRequest>();
    // bool r = trp1->unserialize(str);
    // if (r == false)
    // {
    //     return -1;
    // }
    // r = trp1->check();
    // if (r == false)
    // {
    //     return -1;
    // }
    // cout << trp1->method() << endl;
    // cout << (int)trp1->optype() << endl;
    // cout << trp1->host().first << endl;
    // cout << trp1->host().second << endl;

    // rpc::RpcResponse::ptr trp = rpc::MessageFactory::create<rpc::RpcResponse>();
    // trp->SetRCode(lxprpc::RCode::RCODE_OK);
    // trp->Setresult("33");
    // std::string str = trp->serialize();
    // cout << str << endl;
    // rpc::RpcResponse::ptr trp1 = rpc::MessageFactory::create<rpc::RpcResponse>();
    // bool ret = trp1->unserialize(str);
    // if (ret == false)
    // {
    //     return -1;
    // }
    // ret = trp1->check();
    // if (ret == false)
    // {
    //     return -1;
    // }
    // cout << (int)trp1->rcode() << endl;
    // cout << trp1->result().asString() << endl;

    // rpc::TopicResponse::ptr trp = rpc::MessageFactory::create<rpc::TopicResponse>();
    // trp->SetRCode(lxprpc::RCode::RCODE_OK);
    // std::string str = trp->serialize();
    // cout << str << endl;

    // rpc::TopicResponse::ptr trp1 = rpc::MessageFactory::create<rpc::TopicResponse>();

    // bool ret = trp1->unserialize(str);
    // if (ret == false)
    // {
    //     return -1;
    // }
    // ret = trp1->check();
    // if (ret == false)
    // {
    //     return -1;
    // }
    // cout << (int)trp1->rcode() << endl;

    rpc::ServiceReponse::ptr trp = rpc::MessageFactory::create<rpc::ServiceReponse>();
    trp->Setmethod("add");
    trp->Setoptype(lxprpc::ServiceOptype::SERVICE_DISCOVERY);
    trp->SetRCode(lxprpc::RCode::RCODE_OK);
    std::vector<rpc::Address> addr;
    addr.push_back(rpc::Address("127.0.0.1", 8080));
    addr.push_back(rpc::Address("127.0.0.2", 8081));
    trp->Sethost(addr);
    std::string str = trp->serialize();
    cout << str << endl;

    rpc::ServiceReponse::ptr trp1 = rpc::MessageFactory::create<rpc::ServiceReponse>();
    bool ret = trp1->unserialize(str);
    if (ret == false)
    {
        return -1;
    }
    ret = trp1->check();
    if (ret == false)
    {
        return -1;
    }
    cout << (int)trp1->rcode() << endl;
    cout << (int)trp1->optype() << endl;
    cout << trp1->method() << endl;
    std::vector<rpc::Address> addr1 = trp1->host();
    for (auto &add : addr1)
    {
        cout << add.first << ":" << add.second << endl;
    }
    return 0;
}